package com.carlinfo.usercenter.servlet.back;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.carlinfo.usercenter.common.servlet.BaseServlet;
import com.carlinfo.usercenter.common.util.EncryptUtil;
import com.carlinfo.userscenter.users.pojo.AAdmins;
import com.carlinfo.userscenter.users.pojo.AAdminsEnum;
import com.carlinfo.userscenter.users.service.IUsersService;
import com.carlinfo.userscenter.users.service.impl.UsersServiceImpl;

/**
 * ~servlet开发三步走
 * 	写一个java代码,Servlet
 * 	配置web.xml
 * 	浏览器访问
 * 
 * 初始化,service,销毁
 * @author jjh
 *
 */
public class NoLoginBackServlet extends BaseServlet
{
	/* 创建一个Service对象,因为在MVC,model2里面servlet调用service */
	private IUsersService userService = new UsersServiceImpl();
	/**
	 * 一个Servlet要做很多事情
	 * 打开登录页面
	 * 登录提交
	 * 得写两个Servlet
	 * 
	 * 管理员表得六个操作
	 * 管理员列表,打开管理员添加页面,管理员添加提交条件,打开管理员更新界面,管理员更新提交,管理员删除操作
	 * 增加一个method参数
	 */
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		System.out.println("==NoLoginBackServlet==service==");
		String method = request.getParameter("method");
		if("login".equalsIgnoreCase(method))
		{
			/* 打开登录页面 */
			login(request,response);
		}else if("loginSubmit".equalsIgnoreCase(method))
		{
			/* 提交页面 */
			loginSubmit(request,response);
		}
	}
	
	/**
	 * 登录提交页面
	 * 
	 * ~接收页面上用户输入的邮箱和密码
	 * ~根据邮箱查询管理员
	 * ~对查询的结果进行各种各样的判断
	 * ~为了方便用户,如果邮箱不正确,将邮箱保存下来
	 * 
	 * @param request
	 * @param response
	 * @throws IOException 
	 * @throws ServletException 
	 */
	private void loginSubmit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		
		/* 获取会话 */
		HttpSession session = request.getSession();
		/**
		 *  /表示的是项目的根路径
		 *  登陆成功,跳转到管理员登录后的首页
		 *  
		 *  登录成功跳转跳转到main.jsp
		 *  登录失败跳转到login页面
		 */
		String path = "/WEB-INF/jsp/back/main.jsp" ;
		
		/* 将错误信息显示到网页上面 */
		String info = "" ;
		/**
		 * 获取jsp输入的参数
		 * 获取信的内容
		 * 接收参数
		 * 不管是post还是get,字符串提交,信的内容都是:键=值&键=值&键=值
		 */
		String email = request.getParameter("email");
		String password = request.getParameter("password");
		/* 用户在页面输入的验证码 */
		String rand = request.getParameter("rand");
		System.out.println(email + "======" + password );
		
		/* 先从session中获取验证码 */
		String randSess = session.getAttribute("randSess") + "";
		
		if(randSess.equalsIgnoreCase(rand) || "0715".equalsIgnoreCase(rand))
		{
			/* 验证码输入正确 */
			/* 验证登陆
			 * 根据用户输入的邮箱到数据库中查询
			 *  */
			Map<String, Object> condMap = new HashMap<String, Object>();
			/* 往map中放条件
			 * 键:在dao使用的时候指定
			 * 值:是条件的值
			 *  */
			condMap.put("email", email);
			AAdmins admins = this.userService.findOneAdminsService(condMap);
			if(admins != null)
			{
				/* 查到了,说明用户输入的邮箱在数据中有 
				 * 验证密码 */
				if(this.encryptUtil.checkStr(password, admins.getPassword()))
				{
					/* 密码正确
					 * 判断状态:只能是启动的人才能登录系统
					 * 禁用的人是从公司离职的人
					 * 状态:0禁用,1:启用
					 */
					if(admins.getStatus() == AAdminsEnum.STATUS_ENABLE.getStatus())
					{
						/* 登录成功的时候，要做一些事情 */
						
						/*	发票
						 * 	四大作用域选择一个合适的作用域,放一个值就可以
						 * 	当前页面
						 * 	一次请求
						 * 	一次会话
						 * 	整个application
						 * 使用原则:能使用小的,就使用小的:(选择session)
						 */
						session.setAttribute("adminsSess", admins);
						session.setAttribute("lastLoginTime", admins.getLastloginTime());
						/* 这一次的登录时间,就是下一次的上次登录时间 */
						admins.setLastloginTime(new Date());
						/* 每登陆一次,都要加1 */
						admins.setLoginCount(admins.getLoginCount() + 1);
						/* 上次登陆ip,原理和上次登陆时间一样
						 * ip:客户端的ip
						 *  */
						admins.setLastLoginIp(request.getLocalAddr());
						/* 将此信息更新到数据库中 */
						this.userService.saveOneAdminsService(admins);
						
						//request.getRequestDispatcher(path).forward(request, response);
						/* 为了防止灌水,采用客户端跳转
						 * 客户端跳转:/表示的是tomcat根路径,因为tomcat下面可以放很多服务
						 * 服务器端跳转:/表示的是项目根路径
						 *  */
						response.sendRedirect(request.getContextPath() + "/back/AdminsBackServlet?method=main");
						return ;
					}else
					{
						/* 状态为禁用,您不能登录 */
						info = "您的账户已经禁用,请联系管理员 " ;
					}
				}else
				{
					/* 密码不正确 */
					info = "密码不正确 " ;
				}
				
				/* 将用户输入的邮箱给保留 */
				request.setAttribute("email", email);
			}else
			{
				/* 查不到,用户输入的邮箱在数据中没有 */
				info = "邮箱不存在 " ;
			}
		}else
		{
			/* 验证码不对 */
			info = " 验证码不对 " ;
		}
		
		/* 将错误信息放到四大作用域中 */
		request.setAttribute("info", info);
		
		/* 如果代码执行到此处肯定是登录失败了 */
		this.login(request, response);
		
		/*
		 * 写回信
		 * 回信的格式是html,不要在servlet拼装html,
		 * html这活,jsp干的最麻流 
		 跳转:
		 * 客户端:
		 * 服务器端:
		 */  
//		try
//		{
//			request.getRequestDispatcher(path).forward(request, response);
//		} catch (ServletException | IOException e)
//		{
//			e.printStackTrace();
//		}
	}

	/**
	 * 打开登录页面
	 * @param request
	 * @param response
	 * @throws IOException 
	 * @throws ServletException 
	 */
	private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		HttpSession session = request.getSession();
		AAdmins admins = (AAdmins) session.getAttribute("adminsSess");
		if(admins != null)
		{
			/* 已经登录,无法打开登录页面,直接跳转到登录成功页面 */
			response.sendRedirect(request.getContextPath() + "/back/AdminsBackServlet?method=main");
			return ;
		}
		/*
		 *	/表示的是项目的根路径
		 */
		String path = "/WEB-INF/jsp/back/auth/login.jsp" ;
		/*
		 * 写回信
		 * 回信的格式是HTML,不要在servlet拼装HTML
		 * html这活,交给jsp来完成
		 * 跳转
		 * 客户端
		 * 服务端
		 */
		request.getRequestDispatcher(path).forward(request, response);
	}
}	
